/**
 * 打开多项选择框的dialog时的预处理动作(还原之前选择的信息至已选框)
 * @param btnOpenSelectDialog 触发打开多项选择窗的按钮
 * @param textareaId 多行文本域id
 * @param selectFromId 多项选择框待选框id
 * @param selectToId 多项选择框已选框id
 * @param chooseType 选择类型(单选：single，多选：multiple或null，单选带信息：singleWithMsg，多选带信息：multipleWithMsg)
 * @returns
 */
function operaAfterOpenMultipleSelectDialog(btnOpenSelectDialog, textareaId, selectFromId, selectToId, chooseType) {
	if(chooseType == "single" || chooseType == "singleWithMsg") {
		//单选的情况
		$(".detail .addSomeItem").attr("chooseType", "single");
		//隐藏全选按钮
		$(".detail .addAllItem").hide();
		$(".detail .removeAllItem").hide();
		//如果是单选的情况，让最后一个操作按钮补上底边样式
		$(".detail .removeSomeItem").css("borderBottom", "1px solid #ccc");
	} else if(chooseType == "multiple" || chooseType == "multipleWithMsg") {
		//多选的情况
		$(".detail .addSomeItem").attr("chooseType", "multiple");
		//显示全选按钮
		$(".detail .addAllItem").show();
		$(".detail .removeAllItem").show();
	}
	
	//获取多选项的详细信息列表集合(option中的html)
	var selectHtmlMsgList = btnOpenSelectDialog.parents(".searchForm").find(textareaId).next().children();
	var selectedItems = [];
	var needRemoveItems = []; //需要从待选区中删除的已选项
	//如果是可输入模式，从textarea中加载已选项
	if(btnOpenSelectDialog.hasClass("choosebtn")) {
		var textareaHtmls = $.trim(btnOpenSelectDialog.parents(".searchForm").find(textareaId).val());
		if(textareaHtmls) {
			//已选项内容中以逗号结尾，截取最后的逗号
			if(textareaHtmls.lastIndexOf(",") === textareaHtmls.length - 1) {
				textareaHtmls = textareaHtmls.substring(0, textareaHtmls.length - 1);
			}
			//拆分已选项
			textareaHtmls = textareaHtmls.split(",");
			$.each(textareaHtmls, function(i, itemHtml){
				selectedItems.push("<option value='" + itemHtml + "'>" + itemHtml + "</option>");
				needRemoveItems.push(itemHtml);
			});
		}
	} else {
	//如果是不可输入模式，从html和value的div中加载已选项
		//添加已选中的多选项列表，展现的信息从多行文本域下的div(已保留多选项的详细信息)获取
		//第一个div保存的是详细信息(option中的html)，第二个div保存的是值(option中的value)
		btnOpenSelectDialog.parents(".searchForm").find(textareaId).next().next().children().each(function(index){
			if(chooseType == "singleWithMsg" || chooseType == "multipleWithMsg") {
				//将已选信息，还原至已选多项选择框(带提示信息)
				selectedItems.push("<option value='"+$(this).val()+"' title='"+selectHtmlMsgList.eq(index).val()+"'>"+selectHtmlMsgList.eq(index).val()+"</option>");
				//$(".detail "+selectToId).append("<option value='"+$(this).val()+"' title='"+selectHtmlMsgList.eq(index).val()+"'>"+selectHtmlMsgList.eq(index).val()+"</option>");
			} else {
				//将已选信息，还原至已选多项选择框(不带提示信息)
				selectedItems.push("<option value='"+$(this).val()+"'>"+selectHtmlMsgList.eq(index).val()+"</option>");
				//$(".detail "+selectToId).append("<option value='"+$(this).val()+"'>"+selectHtmlMsgList.eq(index).val()+"</option>");
			}
			needRemoveItems.push($(this).val());
		});
	}
	//从待选区中删除已经加载到已选区的项
	$.each(needRemoveItems, function(i, needRemoveItem){
		var selectedItem = $(".detail "+selectFromId).children("[value='" + needRemoveItem + "']");
		if(selectedItem.length > 0) {
			//若待选列表中包含已选列表的信息，清除待选列表的这个项
			selectedItem.remove();
		}
	});
	//加载已选择的内容到已选区
	if(selectedItems.length > 0) {
		$(".detail "+selectToId).append(selectedItems.join(""));
	}
	//点击时若信息提示层显示，则隐藏信息提示层(避免关闭多项选择窗口时，信息提示层一直处于显示状态)
	setTimeout(function(){
		btnOpenSelectDialog.next().hide();
	}, 500); //信息提示层延迟500毫秒展现，则隐藏时需先延迟500毫秒
}

/**
 * 在多项选择框选择后，需要进行的处理操作
 * @param btnOpenSelectDialog 触发打开多项选择窗的按钮
 * @param showOptionContentType 在展现层中展现的option内容的类型(即需要展现option中的value还是html)
 * @param selectFromId 多项选择框待选框id
 * @param selectToId 多项选择框已选框id
 * @param textareaId 多行文本域id
 * @param showMsgDiv 展现多项选择信息的div
 * @param itemLabelWidth 多项选择信息每个项的label的宽度
 * @param optionHtmlDiv 保存多项选择信息的option中的html的div
 * @param optionValueDiv 保存多项选择信息的option中的value的div
 * @param optionValueDivInputName 保存option的value的div中input的名字
 * @param optionHtmlDivInputName 保存option的html的div中的input的名字
 * @returns
 */
function operaAfterMultipleSelect(btnOpenSelectDialog, showOptionContentType, 
								 selectFromId, selectToId, textareaId, 
								 showMsgDiv, itemLabelWidth, 
								 optionHtmlDiv, optionValueDiv, 
								 optionValueDivInputName, optionHtmlDivInputName) {
	//部分参数为null时，做默认处理
	if(optionHtmlDiv == null) {
		//获取详细信息div(保存的是option中的html)
		optionHtmlDiv = btnOpenSelectDialog.parents(".searchForm").find(textareaId).next();
	}
	if(optionValueDiv == null) {
		//获取值div(保存的是option中的value)
		optionValueDiv = btnOpenSelectDialog.parents(".searchForm").find(textareaId).next().next();
	}
	if(showMsgDiv == null) {
		//获取需要展现信息的div
		showMsgDiv = btnOpenSelectDialog.parents(".searchForm").find(textareaId).prev().prev();
	}
	if(itemLabelWidth == null) {
		//获取多项选择信息每个项的label宽度
		itemLabelWidth = showMsgDiv.attr("itemLabelWidth");
		//没有设置多项选择信息的每个项的label宽度时，设置为0px
		itemLabelWidth = itemLabelWidth ? itemLabelWidth : "0px";
	}
	var selectToOption = $(".detail " + selectToId + " option");
	//传入的保存option的value的div中input的名字如果是null值，进行空串转换
	if(optionValueDivInputName == null) {
		optionValueDivInputName = "";
	}
	//传入的保存option的html的div中input的名字如果是null值，进行空串转换
	if(optionHtmlDivInputName == null) {
		optionHtmlDivInputName = "";
	}
	optionHtmlDiv.empty();
	optionValueDiv.empty();
	var optionHtmls = []; //多选框中的value集合
	var optionValues = []; //多选框中的html集合
	var saveOptionValues = []; //需要记录到textarea的信息内容(记录option的value值)
	var optionContents = []; //搜索层显示的多选信息
	selectToOption.each(function(index){
		saveOptionValues.push($(this).val() + ",");
		//添加选择项的详细信息(option中的html)至多行文本域下的div
		optionHtmls.push("<input type='hidden' name='" + optionHtmlDivInputName + "' value='" + $(this).html() + "' />");
		//添加选择项的值(option中的value)至多行文本域下的div
		optionValues.push("<input type='hidden' name='" + optionValueDivInputName + "' value='" + $(this).val() + "' />");
		//根据类型，确定在展现区域，展现的是option的html还是value
		var optionContent = showOptionContentType === "value" ? $(this).val() : $(this).html();
		//添加选择项的label到展现层
		optionContents.push("<label style='width:"+itemLabelWidth+";display:block;float:left;cursor:pointer;color:#000;'>"+optionContent+",</label>");
	});
	optionHtmlDiv.append(optionHtmls.join("")); //保存多选框中的value集合
	optionValueDiv.append(optionValues.join("")); //保存多选框中的html集合
	
	var saveOptionValuesLength = saveOptionValues.length; //多选信息个数(textarea使用)
	var isInput = btnOpenSelectDialog.hasClass("choosebtn"); //标识是否为可输入模式
	//有选择多选信息并且不是可输入模式的情况，截取最后一个多项选择信息的逗号
	if(!isInput && saveOptionValuesLength > 0) {
		var saveOptionValuesLast = saveOptionValues[saveOptionValuesLength - 1];
		saveOptionValuesLast = saveOptionValuesLast.substring(0, saveOptionValuesLast.length - 1);
		saveOptionValues[saveOptionValuesLength - 1] = saveOptionValuesLast;
	}
	//添加选中值字符串到隐藏的多行文本域，并添加到展现DIV
	var currTextarea = btnOpenSelectDialog.parents(".searchForm").find(textareaId);
	currTextarea.val(saveOptionValues.join(""));
	//如果是可输入模式，使多行文本域滚动到最底部，并使多行文本域获取焦点
	if(isInput) {
		currTextarea.scrollTop(currTextarea.prop("scrollHeight"));
	}
	var optionContentsLength = optionContents.length; //多选信息个数(搜索层展现label使用)
	//有选择多选信息的情况
	if(optionContentsLength > 0) {
		//截取最后一个多项选择信息的逗号，由于截取了最后的label结束符，所以补回来
		var optionContentsLast = optionContents[optionContentsLength - 1];
		optionContentsLast = optionContentsLast.substring(0, optionContentsLast.lastIndexOf(",")) + "</label>";
		optionContents[optionContentsLength - 1] = optionContentsLast;
	} else {
	//没选择多选信息的情况
		optionContents.push("<label style='color:#999;cursor:pointer;'>请点击这里</label>");
	}
	//填充多项选择信息至选择层
	showMsgDiv.html(optionContents.join(""));
}

/**
 * 多选框选择项
 * @param 目标对象(操作按钮)
 * @param operaType 操作类型(add/remove)
 * @param choosedPart 是否全选(all：全选/some：部分);
 * @returns
 */
function chooseItem(target, operaType, choosedPart) {
	var itemFromId = "";
	var itemToId = "";
	//判断操作是选择某部分项还是全选
	var chooseItems = choosedPart == "some" ? ":selected" : "";
	if(operaType == "add") {
		itemFromId = target.attr("itemFromId");
		itemToId = target.attr("itemToId");
		//最大添加总数
		var maxCount = target.attr("maxCount");
		//选择的个数
		var chooseCount = $(".detail #"+itemFromId+" option" + chooseItems).length;
		//已选的个数
		var targetCount = $(".detail #"+itemToId+" option").length;
		//选择和已选的总数大于设定的总个数的情况
		if(parseInt(chooseCount) + parseInt(targetCount) > parseInt(maxCount)) {
			hiAlert("抱歉，最多只允许添加" + maxCount + "个");
			return;
		}
	} else if(operaType == "remove") {
		itemFromId = target.attr("itemToId");
		itemToId = target.attr("itemFromId");
	}
	//获取项的选择类型(单选/多选)
	var chooseType = target.attr("chooseType");
	//没有设置选择类型，默认设置为多选
	if(!chooseType) {
		chooseType = "multiple";
	}
	var selectItems = [];
	$(".detail #"+itemFromId+" option" + chooseItems).each(function(index){
		//当进行项的选择操作时，目标项列表还没有存在当前选择项时，才进行当前选择项的添加操作
		if($(".detail #"+itemToId).children("[value='"+$(this).val()+"']").length == 0) {
			if(chooseType === "multiple") {
				//多项选择操作，保存选择项的HTML到队列中
				selectItems.push($(this).clone().prop('outerHTML'));
			} else {
				//已选列表未包含当前选择项时才进行添加
				//operaChooseItem($(this), "#"+itemToId, chooseType);
				//单选，进行覆盖操作
				//若已选区已进行选择，将之前选择的移回待选区
				var checkedItem = $(".detail " + "#"+itemToId).children(); //获取已选项
				if(checkedItem.length == 1) {
					var selectedAreaId = $(this).parent().attr("id");
					//待选区不存在该项时，才对该项从已选区还原
					if($(".detail #" + selectedAreaId).children("[value='"+checkedItem.val()+"']").length == 0) {
						 $(this).parent().append(checkedItem);
					}
				}
				//将选择项移至已选区
				$(".detail " + "#"+itemToId).html($(this).clone());
			}
		}
		//清除当前选择项
		$(this).remove();
	});
	if(selectItems.length > 0) {
		$(".detail #" + itemToId).append(selectItems.join(""));
	}
}

/**
 * @deprecated
 * 项的选择操作控制
 * @param selectedItem 选择项对象
 * @param targetId 选择项需要转移到的项列表ID(即目标select控件ID)
 * @param chooseType 选择类型(多选：multiple，单选：single)
 * @returns
 */
function operaChooseItem(selectedItem, targetId, chooseType) {
	//当进行项的选择操作时，目标项列表还没有存在当前选择项时，才进行当前选择项的添加操作
	if($(".detail "+targetId+" option[value='"+selectedItem.val()+"']").length == 0){
		if(chooseType == "multiple") {
			//多选，进行项叠加
			$(".detail " + targetId).append(selectedItem.clone());
		} else if(chooseType == "single") {
			//单选，进行覆盖操作
			//若已选区已进行选择，将之前选择的移回待选区
			var checkedItem = $(".detail " + targetId).children(); //获取已选项
			if(checkedItem.length == 1) {
				var selectedAreaId = selectedItem.parent().attr("id");
				//待选区不存在该项时，才对该项从已选区还原
				if($(".detail #" + selectedAreaId + " option[value='"+checkedItem.val()+"']").length == 0) {
					selectedItem.parent().append(checkedItem);
				}
			}
			//将选择项移至已选区
			$(".detail " + targetId).html(selectedItem.clone());
		}
	}
	//清除当前选择项
	selectedItem.remove();
}

/**
 * 移动选项中项(目前需求，只允许移动一项)
 * @param target 目标按钮
 * @param moveType 移动类型(up：上移，down：下移)
 * @deprecated
 */
function moveItem(target, moveType) {
	var itemToId = target.attr("itemToId");
	var selectedItems = $(".detail #"+itemToId+" option:selected");
	if(selectedItems.length == 0) {
		hiAlert("请选择需要移动的选中项!", "提示");
		return;
	} else if(selectedItems.length > 1) {
		hiAlert("只能选择一项进行移动!", "提示");
		return;
	}
	//获取选中项需要移动的目标参照物(选中项之前或者之后的选项)
	var target = null;
	if(moveType == "up") {
		target = selectedItems.prev(); //获取选中项的前一项
	} else if(moveType == "down") {
		target = selectedItems.next(); //获取选中项的后一项
	}
	//目标选项存在的情况
	if(target.length == 1) {
		var currCloneItem = selectedItems.clone();
		if(moveType == "up") {
			//复制一份当前选中项，移动到目标选项的之前
			target.before(currCloneItem);
		} else if(moveType == "down") {
			//复制一份当前选中项，移动到目标选项的之后
			target.after(currCloneItem);
		}
		//令被移动的项继续保持选中状态
		$(".detail #"+itemToId).val(currCloneItem.val());
		selectedItems.remove(); //原位置的选中项移除
	}
}

$(function(){
	//添加一个选择项
	$(".detail .addSomeItem").live("click", function(){
		chooseItem($(this), "add", "some");
	});
	//添加全部选择项
	$(".detail .addAllItem").live("click", function(){
		chooseItem($(this), "add", "all");
	});
	//移除一个选择项
	$(".detail .removeSomeItem").live("click", function(){
		chooseItem($(this), "remove", "some");
	});
	//移除全部选择项
	$(".detail .removeAllItem").live("click", function(){
		chooseItem($(this), "remove", "all");
	});
	//已选框选项上移操作
	$(".detail .moveUpSomeItem").live("click", function(){
		moveItem($(this), "up");
	});
	//已选框选项下移操作
	$(".detail .moveDownSomeItem").live("click", function(){
		moveItem($(this), "down");
	});
	//多选待选项的双击事件操作
	$(".detail .mulWaitSelect").live("dblclick", function(){
		$(".detail .addSomeItem").click();
	});
	//多选已选项的双击事件操作
	$(".detail .mulHasSelect").live("dblclick", function(){
		$(".detail .removeSomeItem").click();
	});
	
	/*------------------------------多项选择框的鼠标移动事件(开始)-----------------------------------*/
	var timeoutOver;
	$("div.multipleChoiceDiv").live("mouseenter", function(){
		var currentObj = $(this);
		var needShowMsg = currentObj.html(); //获取需要展现的多项选择信息
		//有进行多项选择时，展现提示层
		if(needShowMsg != "") {
			//获取多项信息展现层的div宽度
			var totalWidth = currentObj.css("width");
			//获取多项信息展现层的div宽度的数值(不存在时，赋值为0)
			totalWidth = totalWidth ? parseInt(totalWidth.substring(0, totalWidth.indexOf("px"))) : 0;
			//获取多项选择信息每个项的label宽度的数值
			var itemLabelWidth = currentObj.attr("itemLabelWidth");
			//获取多项选择信息每个项的label宽度(不存在时，赋值为0)
			itemLabelWidth = itemLabelWidth ? parseInt(itemLabelWidth.substring(0, itemLabelWidth.indexOf("px"))) : 0;
			//截掉前两行，从第三行开始提示(由于外面已经展现了两行信息)
			timeoutOver = setTimeout(function(){
				if(totalWidth != 0 && itemLabelWidth != 0) {
					//通过多项信息展现层的div宽度和多项选择信息每个项的label宽度，求出每行的多项选择信息个数
					var firstTwoLinesCount = parseInt(totalWidth / itemLabelWidth);
					//当多项选择信息大于一行时才展现提示层
					if(currentObj.children().length > firstTwoLinesCount) {
						//提示层获取展现层的信息
						currentObj.next().html(currentObj.html());
						//获取展现层的位置
						/*var top = currentObj.offset().top;
						var left = currentObj.offset().left;*/
						//提示层的位置设置为展现层的位置
						/*currentObj.next().offset({top:top,left:left});*/
						currentObj.next().show();
					}
				}
			},500);
		}
	});
	
	$("div.multipleChoiceDetailDiv").live("mouseenter",function(){
		//获取只显示两行信息的DIV的坐标
		//var top = $(this).prev().offset().top;
		//var left = $(this).prev().offset().left;
		//设置提示信息DIV的位置为显示两行信息DIV的位置
		//$(this).offset({top:top,left:left});
		$(this).show();
	});
	$("div.multipleChoiceDiv").live("mouseleave", function(){
		clearTimeout(timeoutOver);
		//由于信息提示层展现时，信息层便会失去焦点，信息提示层从隐藏到显示的过程会令效果闪一下
		//所以信息层失去焦点时只需清除延时变量即可，信息提示层的隐藏交还给它自己处理。
		//$(this).next().hide(); //隐藏信息提示层
	});
	$("div.multipleChoiceDetailDiv").live("mouseleave",function(){
		clearTimeout(timeoutOver);
		$(this).hide(); //隐藏信息提示层	
	});
	/*------------------------------多项选择框的鼠标移动事件(结束)-----------------------------------*/
});